/*****************************************Copyright(C)******************************************
****************************************** *********************************************
*------------------------------------------文件信息---------------------------------------------
* FileName          : Bsp_iap.c
* Author            : 张婷颖
* Version           : 1.0V
* Description       :
*----------------------------------------历史版本信息-------------------------------------------
* History           :
* Description       :
*-----------------------------------------------------------------------------------------------
***********************************************************************************************/
/* Includes-----------------------------------------------------------------------------------*/
#include <Bsp_flash.h>
#include <Bsp_iap.h>
#include "main.h"
#include "stm32f4xx.h"
#include "bsp_uart.h"
/* Private define-----------------------------------------------------------------------------*/

/* Private typedef----------------------------------------------------------------------------*/

/* Private macro------------------------------------------------------------------------------*/

/* Private variables--------------------------------------------------------------------------*/
uint32_t iapbuf[512]; 	  //2K字节缓存
uint8_t finish_flag = 0;       //重启标志
/* Private function prototypes----------------------------------------------------------------*/

/* Private functions--------------------------------------------------------------------------*/
/************************************************
函数名称 ： iap_write_appbin
功    能 ：写入bin
参    数 ：从指定位置写指定长度内容
返 回 值 ：
*************************************************/
void iap_write_appbin(uint32_t appxaddr,uint8_t *appbuf,uint32_t appsize)
{
	uint32_t t;
	uint16_t i=0;
	uint32_t temp;
	uint32_t fwaddr=appxaddr;//当前写入的地址
	uint8_t *dfu=appbuf;
	uint32_t app_updata_flag[3] = {APP_UPDATA_FLAG,appxaddr,appsize};       //更新app的标志,B区存放地址，文件大小
	uint32_t rest_flag_a = RESET_FLAG;
//	 // 确保擦除相应的Flash区域，这里假设STMFLASH_Erase函数存在
//	STMFLASH_Erase(fwaddr, (appsize + 2047) / 2048);  // 2048为一页的大小，按页数进行擦除

	for(t=0;t<appsize;t+=4)
	{
		temp=(uint32_t)dfu[3]<<24;
		temp|=(uint32_t)dfu[2]<<16;
		temp|=(uint32_t)dfu[1]<<8;
		temp|=(uint32_t)dfu[0];
		dfu+=4;//偏移四个字节
		iapbuf[i++]=temp;
		if(i==512)
		{
			i=0;
			STMFLASH_Write(fwaddr,iapbuf,512);
			fwaddr+=2048;//偏移2048  512*4=2048
		}
	}
	if(i)STMFLASH_Write(fwaddr,iapbuf,i);//最后的一些内容字节写进去

	STMFLASH_Write(FLASH_FLAG_ADDR,app_updata_flag,3);
//	STMFLASH_Write(FLASH_RESET_ADDR,&rest_flag_a,1);

//	__set_FAULTMASK(1); //关闭所有中断
//	NVIC_SystemReset();
//	HAL_Delay(100);
//	finish_flag = 1;
//	__disable_fault_irq();

}


/************************************************
函数名称 ： whether_reset
功    能 ：判断是否接收结束要重启
参    数 ：
返 回 值 ：
*************************************************/
void whether_reset(void)
{
	if(finish_flag)
	{
		iap_write_appbin(FLASH_APP1_ADDR,flash_buf,flash_len);     //更新flash代码
		finish_flag = 0;
		flash_len = 0;
		__set_FAULTMASK(1); //关闭所有中断
		NVIC_SystemReset(); //软件重启
		HAL_Delay(100);
	}
}
